home *** CD-ROM | disk | FTP | other *** search
/ Turnbull China Bikeride / Turnbull China Bikeride - Disc 2.iso / STUTTGART / DEMOS / SWARS / !Swars / Sources / c / !RunImage next >
Text File  |  1996-03-17  |  5KB  |  206 lines

  1. /*******************************************************/
  2. /* -=[FlY'96]=- StarWars scroller (no vertical deform) */
  3. /*******************************************************/
  4.  
  5. /* includes */
  6.  
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. #include <kernel.h>
  10. #include <swis.h>
  11. #include <math.h>
  12. #include "Swarshead.h"
  13.  
  14. #ifdef C4
  15. #include "bbc.h"
  16. #endif
  17.  
  18. #define C5
  19.  
  20. /* Global variables */
  21.  
  22. screen scr;
  23.  
  24. /* MAIN --------------------------------------- */
  25.  
  26. int main (void)
  27. {
  28.   /* variables used */
  29.   FILE *in;
  30.   int   i;
  31.  
  32.   _kernel_swi_regs reg;
  33.   _kernel_oserror *err;
  34.   int block[8];
  35.   char char_buffer[8];
  36.   unsigned char *buf;
  37.   unsigned char *imgd;
  38.   unsigned int   s[SCRLENGTH];
  39.   scrobj p[SCRLENGTH];
  40.  
  41.   scr.mode = GFXMODE;
  42.  
  43. #ifdef C4
  44.   bbc_mode(scr.mode);
  45. #endif
  46.  
  47. #ifdef C5
  48.    char_buffer[0] = 22;
  49.    char_buffer[1] = scr.mode;
  50.  
  51.    reg.r[0] = (int)char_buffer;
  52.    reg.r[1] = 2;
  53.    if((err=_kernel_swi(OS_WriteN, ®, ®)) != NULL) {
  54.      fprintf(stderr,"OS_WriteN error : %s\n", err->errmess);
  55.      exit(EXIT_FAILURE);
  56.    }
  57. #endif
  58.  
  59. /* OFF */
  60.    if((err=_kernel_swi(OS_RemoveCursors, ®, ®)) != NULL) {
  61.      fprintf(stderr,"OS_RemoveCursors error : %s\n", err->errmess);
  62.      exit(EXIT_FAILURE);
  63.    }
  64.  
  65.    block[0] = 148;
  66.    block[1] = 149;
  67.    block[2] = 150;
  68.    block[3] = -1;
  69.  
  70.    reg.r[0] = (int)block;
  71.    reg.r[1] = (int)block;
  72.    if((err=_kernel_swi(OS_ReadVduVariables, ®, ®)) != NULL) {
  73.      fprintf(stderr,"OS_ReadVduVariables error : %s\n", err->errmess);
  74.      exit(EXIT_FAILURE);
  75.    }
  76.  
  77.    scr.ScreenStart  = (unsigned char *)block[0];
  78.    scr.DisplayStart = (unsigned char *)block[1];
  79.    scr.TotalScreenSize = (unsigned int)block[2];
  80.  
  81.    if((buf = calloc(SCRSIZE,sizeof(char))) == NULL) {
  82.      fprintf(stderr,"Cannot allocate %u bytes for buffer\n", SCRSIZE*sizeof(char));
  83.      exit(EXIT_FAILURE);
  84.    }
  85.    if((imgd = calloc(SCRSIZE,sizeof(char))) == NULL) {
  86.      fprintf(stderr,"Cannot allocate %u bytes for imgd\n", SCRSIZE*sizeof(char));
  87.      exit(EXIT_FAILURE);
  88.    }
  89. /* load image */
  90.    #ifdef DEBUG
  91.    printf("Loading image\n");
  92.    #endif
  93.    if((in=fopen("<Swars$Dir>.Swarspic","rb")) == NULL) {
  94.       fprintf(stderr,"Cannot open \"swarspic\" for input\n");
  95.       exit(EXIT_FAILURE);
  96.    }
  97.    for (i=0;i<56;i++) buf[i] = fgetc(in); /* skip info bytes */
  98.    for(i=0; i<SCRSIZE; i++)  buf[i] = fgetc(in);
  99.    fclose(in);
  100. /* end load image into buffer */
  101.  
  102. /*-----------------------------------------------------------------------*/
  103.    /* init for the loop */
  104.    #ifdef DEBUG
  105.    printf("Building an object ...\n");
  106.    #endif
  107.    initobjet(p);
  108.  
  109.    #ifdef DEBUG
  110.    printf("Initialising the steps ...\n");
  111.    #endif
  112.    initstep(s,p);
  113.  
  114.    #ifdef DEBUG
  115.    for(i=SCRLENGTH;i>=LENGTHMAX;i--) printf("%u  %u %u\n",p[i].start,p[i].stop,s[i]);
  116.    printf("And now the deformation effect ...\n");
  117.    #endif
  118.  
  119.    do
  120.    { /* wait vbl */
  121.      reg.r[0] = 19;
  122.      reg.r[1] = 0;
  123.      if((err=_kernel_swi(OS_Byte, ®, ®)) != NULL) {
  124.      fprintf(stderr,"OS_Byte error : %s\n", err->errmess);
  125.      exit(EXIT_FAILURE);
  126.      }
  127.      /* end wait vbl */
  128.      stretch(buf,imgd,s,p); /* stretch buffer onto the object and display */
  129.      scrolls(buf);          /* scroll the original image one line up */
  130.      _kernel_swi(OS_Mouse, ®,®);
  131.    } while(reg.r[2] == 0);
  132.  
  133.    return(0);
  134. }
  135. /*-----------------------------------------------------------------------*/
  136.  
  137. /*******************************/
  138. /* Functions used in this code */
  139. /*******************************/
  140.  
  141. void initobjet(scrobj *p)
  142. {
  143.   int i;
  144.  
  145.   for (i=SCRLENGTH-1;i>=LENGTHMAX;i--)
  146.   {
  147.     p[i].start=SCRLENGTH-i;
  148.     p[i].stop=SCRWIDTH-2*p[i].start-1;
  149.   }
  150. }
  151. /**************************************************************************/
  152. void initstep(unsigned int *s, scrobj *p)
  153. {
  154.   int  i;
  155.  
  156.   for (i=SCRLENGTH-1;i>=LENGTHMAX;i--)
  157.   {
  158.     s[i]=(SCRWIDTH << 8)/(p[i].stop);
  159.   }
  160. }
  161. /**************************************************************************/
  162. void stretch(unsigned char *buf,unsigned char *imgd,unsigned int *s, scrobj *p)
  163. {
  164.   unsigned char *ecran;
  165.   unsigned int i,j,k,z,stp,stl;
  166.  
  167.   ecran=scr.DisplayStart;
  168.  
  169.   for (i=SCRLENGTH-1;i>=LENGTHMAX;i--)
  170.   {
  171.     stp=s[i];
  172.     stl=0;
  173.     z=(p[i].start % SCRWIDTH) + i*SCRWIDTH;
  174.     k=p[i].stop;
  175.     for(j=0;j<k;j++)
  176.     {
  177.       ecran[z+j]=(imgd[z+j]=buf[i*SCRWIDTH+stl]);
  178.       stp=s[i]+stp;
  179.       stl=((1 << 8)+stp) >> 8;
  180.     }
  181.   }
  182. }
  183. /**************************************************************************/
  184. void scrolls(unsigned char *buf)
  185. {
  186.   unsigned char save[SCRWIDTH];
  187.   int i,j;
  188.  
  189.   for (i=0;i<SCRWIDTH;i++)
  190.   {
  191.      save[i]=buf[i];
  192.   }
  193.   for (i=0;i<SCRLENGTH;i++)
  194.   {
  195.     for (j=0;j<SCRWIDTH;j++)
  196.     {
  197.       buf[i*SCRWIDTH+j]=buf[(i+1)*SCRWIDTH+j];
  198.     }
  199.   }
  200.   for (i=0;i<SCRWIDTH;i++)
  201.   {
  202.     buf[(SCRLENGTH-1)*SCRWIDTH+i]=save[i];
  203.   }
  204. }
  205.  
  206.